package com.shujia.wyh.day21;

import java.util.HashMap;
import java.util.Map;

/*
        Map接口：
            public interface Map<K,V>
            将键映射到值的对象。
            Map不能包含重复的键。
            每个键可以映射到最多一个值。

        举例：
            <K,V> 键值对
            1001 李毅
            1002 小虎
            1002 李毅（不允许的）
        在Map集合中，K的值不能重复

        面试题：Map接口与Collection接口的区别？
            1、他们都是属于java.util包下的，Map接口与Collection接口属于平级关系，不存在继承关系
            2、Map集合中存储的元素都是成对出现的，Map集合中的键是唯一的，值是可以重复，有些书籍把键值对称之为夫妻对
            3、Collection集合中的元素都是单独出现的，Collection下Set相关集合元素是唯一的，List相关集合元素是可以重复的
                像这样单独出现的元素，称之为光棍。
       Map相关集合的方法：
            1、添加功能：
                V put(K key, V value) 将指定的值与该映射中的指定键相关联（可选操作）。
                举例：map.put("1001","小虎");
            2、删除功能
                void clear() 从该map中删除所有的映射（可选操作）。
                V remove(Object key) 如果存在（从可选的操作），从该地图中删除一个键的映射。
            3、判断功能
                boolean containsKey(Object key) 如果此映射包含指定键的映射，则返回 true 。
                boolean containsValue(Object value) 如果此map将一个或多个键映射到指定的值，则返回 true 。
                boolean isEmpty() 如果此map不包含键值映射，则返回 true 。
            4、获取功能
                V get(Object key) 返回到指定键所映射的值，或 null如果此映射包含该键的映射。
                Set<Map.Entry<K,V>> entrySet() 返回此map中包含的映射的Set视图。
                Set<K> keySet() 返回此map中包含的键的Set视图。
                Collection<V> values() 返回此map中包含的值的Collection视图。
            5、长度功能
                int size() 返回此map中键值映射的数量。

         注意：
            api所说的映射指的是一个键值对

 */
public class MapDemo1 {
    public static void main(String[] args) {
        //创建Map集合对象
        //由于Map是一个接口，不能直接被实例化，所以要找一个该接口的具体实现子类，利用接口多态的形式创建对象
        Map<Integer, String> map = new HashMap<>();

        //V put(K key, V value) 将指定的值与该映射中的指定键相关联（可选操作）
        //向集合中添加元素
        //返回的是该键对应的被覆盖的历史的值
        //多次添加同一个ley映射的时候，key只能有一个，值直接被覆盖
//        map.put(1001,"小虎");
        System.out.println(map.put(1001, "小虎")); //null
        System.out.println(map.put(1001, "小虎2")); //小虎
        System.out.println(map);
        System.out.println("map集合中键值对的数量：" + map.size());
        map.put(1002,"李毅");
        map.put(1003,"程鹏飞");
        map.put(1004,"朱志强");
        map.put(1005,"姚欣");

        System.out.println(map);
        System.out.println("==================================");
        //void clear() 从该map中删除所有的映射（可选操作）。
//        map.clear();
//        System.out.println(map);
        System.out.println("===================================");
        //V remove(Object key) 如果存在（从可选的操作），从该地图中删除一个键的映射。
        //返回的是被删除的key对应的值，并且整个映射从map集合中移除
//        System.out.println(map.remove(1002));
        //如果要删除的key在集合中不存在，不会报错，返回的是value类型的默认值 null
        System.out.println(map.remove(1009));
        System.out.println(map);

        System.out.println("==================================");
        //boolean containsKey(Object key) 如果此映射包含指定键的映射，则返回 true 。
        System.out.println(map.containsKey(1002)); // true
        System.out.println(map.containsKey(1009)); // false

        System.out.println("===================================");
        //boolean containsValue(Object value) 如果此map将一个或多个键映射到指定的值，则返回 true 。
        System.out.println(map.containsValue("小虎"));
        System.out.println(map.containsValue("小虎2"));

        System.out.println("===================================");
        //boolean isEmpty() 如果此map不包含键值映射，则返回 true 。
        System.out.println(map.isEmpty()); //false


    }
}
